package com.ant.storage.service.impl;

import com.ant.storage.mapper.ProvinceCityCountyMapper;
import com.ant.storage.pojo.ProvinceCityCounty;
import com.ant.storage.service.IProvinceCityCountyService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

/**
 * <p>
 * 服务实现类
 * </p>
 *
 * @author hzd
 * @since 2025-10-26
 */
@Service
public class ProvinceCityCountyServiceImpl extends ServiceImpl<ProvinceCityCountyMapper, ProvinceCityCounty> implements IProvinceCityCountyService {
    /**
     * 获取完整的城市树形结构（省→市→县→乡镇）
     */
    @Override
    public List<ProvinceCityCounty> listTree() {
        List<ProvinceCityCounty> allRegions = baseMapper.selectList(null);

        // 2. 筛选顶级节点：pid=0 且 type=1（省份），并按名称或编码排序
        List<ProvinceCityCounty> provinces = allRegions.stream()
                .filter(region -> region.getPid().equals(0) && region.getType().equals(1) && region.getName().equals("四川省"))
                .sorted(Comparator.comparing(ProvinceCityCounty::getCode)) // 按编码排序（保证顺序一致）
                .collect(Collectors.toList());

        // 3. 为每个省份递归添加子节点（市→县）
        provinces.forEach(province -> buildChildren(province, allRegions));
        return provinces;
    }

    /**
     * 递归为父节点添加子节点
     *
     * @param parent     父节点（省/市）
     * @param allRegions 所有启用的地区数据
     */
    private void buildChildren(ProvinceCityCounty parent, List<ProvinceCityCounty> allRegions) {
        // 筛选当前父节点的子节点：pid=父节点ID，且状态为启用
        List<ProvinceCityCounty> children = allRegions.stream()
                .filter(region -> region.getPid().equals(parent.getId()))
                .sorted(Comparator.comparing(ProvinceCityCounty::getCode)) // 按编码排序
                .collect(Collectors.toList());

        if (!children.isEmpty()) {
            parent.setChildren(children);
            // 递归处理子节点的下一级（如市的子节点是县）
            for (ProvinceCityCounty child : children) {
                // 县（type=3）没有下一级，可加判断终止递归（可选优化）
                if (child.getType() < 3) {
                    buildChildren(child, allRegions);
                }
            }
        }
    }

    /**
     * 按需查询：根据父ID查询子节点（如选择省后查市，选择市后查县）
     *
     * @param pid 父级ID
     */
    public List<ProvinceCityCounty> getChildrenByPid(Integer pid) {
        // 查询指定父ID的启用子节点，并按编码排序
        return baseMapper.selectList(new QueryWrapper<ProvinceCityCounty>().eq("pid", pid).eq("status", 1))
                .stream()
                .sorted(Comparator.comparing(ProvinceCityCounty::getCode))
                .collect(Collectors.toList());
    }


    /**
     * 获取单个省份的数据
     * @return
     */
    @Autowired
    public ProvinceCityCounty singleListTree() {
        // 1. 查询四川省根节点
        ProvinceCityCounty sichuan = baseMapper.selectOne(new QueryWrapper<ProvinceCityCounty>()
                .eq("id", 2638).eq("status", 1));
        if (sichuan == null) {
            throw new RuntimeException("未找到四川省数据");
        }
        // 2. 递归查询下属市、县
        buildChildren(sichuan);
        return sichuan;
    }


    /**
     * 递归为节点添加子节点（市→县）
     * @param parent 父节点（如四川省、某市）
     */
    private void buildChildren(ProvinceCityCounty parent) {
        // 查询当前父节点的子节点（如四川省的子节点是市，市的子节点是县）
       // List<ProvinceCityCounty> children = baseMapper.selectList(new QueryWrapper<ProvinceCityCounty>().eq("pid", parent.getId()).eq("status",1));
        List<ProvinceCityCounty> children = baseMapper.selectChildrenByPid(parent.getId());
        if (!children.isEmpty()) {
            parent.setChildren(children);
            // 递归查询子节点的下属（如市的下属县）
            for (ProvinceCityCounty child : children) {
                buildChildren(child);
            }
        }
    }
}
